#include "head.S"

main:
// Initialiser la pile
	movl $(stack + STACK_SIZE),%esp
	movl %esp,%ebp

	movl $0xb8004,%ebx
// recuperer des caracteres sur le port serie
blop:	call getchar
	cmp $13, %al
	jz enter
// On l affiche a l ecran
	movb %al,(%ebx)
	addl $2,%ebx    // sauter 2 octets: un pour le caractere, l autre pour la couleur
	addl $1, cpt
	jmp blop
// On s arrete
	hlt

enter:	
	movl cpt, %edx
	movl %edx, %edi
again:	cmp $80, %edi
	jge sub80
	subl %edi, %ebx
	subl %edi, %ebx
	addl $80, %ebx
	addl $80, %ebx
	movl $0, cpt
	jmp blop
sub80:
	subl $80, %edi
	jmp again
	.size main,.-main

// char getchar(void);

getchar:
// On attend qu un caractere arrive sur le port serie
	movw $0x3f8+5,%dx
	movb $1,%cl
loop:
	inb  %dx,%al
	andb %cl,%al    // tester l arrivee
	jz   loop
// Il est arrive, on le lit
	movw $0x3f8,%dx
	inb  %dx,%al
        ret

        .size getchar,.-getchar

// void putchar(char);

putchar:
// On emet un charactere sur le port serie
        movl 4(%esp),%eax
	movw $0x3F8,%dx
	outb %al,%dx
	ret

        .size putchar,.-putchar


numbers:
//on affiche les nombres de 0 à 9
	movl $0xb8000,%ebx
	movb char0,%al
	movl $10, %ecx
ploop:	movb %al,(%ebx)  //affiche le nombre
        addl $2,%ebx    // sauter 2 octets: un pour le caractere, l autre pour la couleur
        addb $1,%al     // passer au chiffre suivant
	subl $1, %ecx
	jne ploop
	ret


// Juste un exemple de variable
charA:
	.byte 65
char0:
	.byte 48

cpt: 
	.long 0


.comm stack,STACK_SIZE
